package cn.tedu.api;

import java.util.Arrays;
import java.util.Locale;

/*本类用来测试String类的常用方法*/
public class TestString2 {
    public static void main(String[] args) {

        System.out.println(method());//return可以打印出来,如果有sout同时打印

        int method = method();
        System.out.println(method); //将return传值给新对象,再打印,如果有sout同时打印


        //1.使用两种创建方式,创建字符串,存数据:abc
        char[] values = {'a','b','c'}; //static创建方式
        String s1 = new String(values); //数组作为参数传进去
        //简单直接写
        String s2 = "abc";
        //s2 = "abcdef";//除了数组,基本类型和字符串类型可以改变值

        //2.测试常用方法
        System.out.println(s1.equals(s2));//true//Object的equals()方法,比较的引用地址值
        /*String重写了hashCode(),是根据字符串的具体内容[字符串内筒](内容也可以是数据)生成哈希码值,而不是根据地址值生成
         * 所以虽然s1与s2的地址值不同,但是它们的哈希码值一样*/
        System.out.println(s1.hashCode());//96354
        System.out.println(s2.hashCode());//96354

        /*String也重写了Object中的toString(),打印的是字符串的具体内容*/
        System.out.println(s1);//abc

        System.out.println(s1.length());//3,查看当前字符串的长度
        System.out.println(s1.toUpperCase());//ABC,将本字符串转为全大写
        System.out.println(s1.toLowerCase());//abc,将本字符串转为全小写
        System.out.println(s1.startsWith(""));//true,判断本字符串是否以指定元素a开头
        System.out.println(s1.startsWith("ab"));//true,判断本字符串是否以指定元素a开头
        System.out.println(s1.endsWith(""));//false,判断本字符串是否以指定元素a结尾
        System.out.println(s1.endsWith("abc"));//false,判断本字符串是否以指定元素a结尾

        System.out.println(s1.charAt(2));//a,根据下标获取本字符串中对应位置上的元素
        System.out.println(s1.charAt(1));
        System.out.println(s1.charAt(0));

        String s3 = "abcbdbba";
        System.out.println(s3.indexOf("b"));//1,返回指定字符第一次出现的下标
        System.out.println(s3.indexOf("e"));// -1 if there is no such occurrence.
        System.out.println(s3.lastIndexOf("b"));//6,返回指定元素最后一次出现的下标

        System.out.println(s2.concat("cxy"));//abccxy,将指定字符串拼接到本字符串的结尾 || 某种程度: 1)封装了return String的对象;2) 如果有sout同时打印 native C++和C
        System.out.println(s2);//abc,说明上面的拼接是临时的,不会改变原串s2的内容,,,拼接是临时的

        String s4 = s2.concat("aaa");//如果想要多次使用拼接后的结果,需要定义一个字符串保存结果,定义一个对象来接这个返回值,,,
        System.out.println(s4);//abcaaa

        for (int i = 0; i < 10000; i++) {
            s2 = s2.concat("abc");//1)字符串对象拼接concat方法的字符串实参后,2)可以赋值给自己
        }
        System.out.println(s2);


        String s5 = "afbbbBfcfdfe";

        //返回值类型是String[],所以需要Arrays.toString()打印
        //以指定字符(双引号的单个字符)作为分割符,分割当前的字符串,把f换成逗号
        String[] a = s5.split("f"); //字符串类型转字符串数组类型// 等价: String[] a1 = new String[]{"a","b","c","d","e"};
        System.out.println(a);
        System.out.println(Arrays.toString(a));//[a, b, c, d, e]
        //我们也可以遍历数组,拿到数组中每个元素
        for (int i = 0; i < a.length; i++) { //字符串数组对象生命周期在主函数方法以内,,,a对象的下标i在for结构方法以内,
            System.out.println("数组对象a的第"+i+"个元素值:"+a[i]);//print下一行不换行
        }

        String s6 = "      hh hhh    h ";//去除字符串首尾两端的空格
        System.out.println(s6.trim());//hh hhh

        String s7 = "abcdefgh";
        System.out.println(s7.substring(3));//defgh,从指定下标处开始截取子串[3,结束]
        System.out.println(s7.substring(3,6));//def,从指定下标处开始截取子串[3,6)含头不含尾

        System.out.println(20+10);//30,int+int->计算效果
        System.out.println("20"+10);//2010,String+int->拼接效果
        System.out.println("20"+"10");//2010,String+int->拼接效果
        System.out.println(String.valueOf(10));//10//静态资源不通过对象调用,通过类名调用
        System.out.println(String.valueOf(80)+10);//8010,将int类型的80转为String类型

        System.out.println(s7);
        byte[] bs = s7.getBytes();//将指定字符串转为byte[]//String的自带方法getBytes()
        // byte[] byte = new byte[]{'a','b','c','d','e','f','g','h'};//字节的数组
        System.out.println(Arrays.toString(bs));//[97, 98, 99, 100, 101, 102, 103, 104]
    }

    private static int method() {
        System.out.println(4);
        return 3;
    }
}
